<?php


namespace app\text\controller;


use \app\text\model\User as UserModel;
use think\console\command\make\Model;
use think\Controller;
use think\Db;

class User extends Controller
{
    public function index(){
//        $result = UserModel::select();
//        return json($result);

//        UserModel::destroy(1008);

        //通过 模型 -> 符号，可以得到单独的字段数组
        //使用get()方法 通过主键id查询到想要的数据
//        $user = UserModel::get(250);
//        return json($user);
//        return json($user->username);

        //也可以使用where()方法进行条件查询筛选数据
//        $user = UserModel::where('username','铁鼠')->find();
////        return json($user);
////        return json($user->username);

        //不管是get() 还是 find()方法。如果数据不存在则返回NULL


        //和数据库查询一样，，模型还有getOrFail()方法，数据不存在抛出异常
        //还有findOrEmpty()方法，数据不存在返回空数组


        //通过all（）方法，实现 IN模式的多数据获取
//          $user = UserModel::all('250,251');
//          return json($user);

        //使用链式查询获得想要的数据
//        $user = UserModel::where('gender','男')->order('id','asc')->limit(2)->select();
//        return json($user);

        //获取某个字段或者某个列的值
//        $user = UserModel::where('id',79)->value('username');
//        $user = UserModel::whereIn('id',[250,251,251])->column('username','id');
//        return json($user);

        //模型支持动态查询：getBy*,*表示字段名
//        $user = UserModel::getByUsername('鬼切');
//        $user = UserModel::getByEmail('guiqie@qq.com');
//        return json($user);

        //模型支持聚合查询
//        return UserModel::max('price');




        //模型获取器
        //获取器的作用是对模型实例的数据做出自动处理
   //     $user = UserModel::get(250);
//        return json($user->status);
//        return json($user->nothing);
//        return json($user);                   //打印获取器修改后的值
       // return json($user->getData('status'));   //打印原始值Status
//        return json($user->getData());            //打印原始字段的值

        //使用WithAttr在控制器端实现动态获取器，比如设置所有email大写
//        $user = UserModel::WithAttr('email',function($value){
//            return strtoupper($value);
//        })->select();
//        return json($user);

        //使用WithAttr在控制器端实现动态获取器，比如设置status
//        $user = UserModel::WithAttr('status',function($value){
//            $Status = [
//                -1 => '删除',
//                0  => '禁用',
//                1 => '正常',
//                2 => '待审核'
//            ];
//            return $Status[$value];
//        })->select();
//        return json($user);

        //同时定义了模型获取器 和 动态获取器  那么模型获取器优先级更高

        //模型修改器
        //作用：就是对模型对象的值进行处理
        // 比如：我们要新增数据的时候，对数据进行格式化，过滤，转换处理
        //  除了新增，会调用修改器，修改更新也会触发修改器
        // 模型修改器只会对模型方法有效，调用数据库的方法是无效的，比如->sert()



    }

    public function insert(){
        //1. 使用实例化的方式添加一条数据，首先实例化方式如下，两种均可：
        $user = new userModel();  //$user = new \app\text\model\User();

        //2.设置要新增加的数据，然后用save()方法写入到数据库中，save()返回布尔值
//        $user->username = '鸦天狗';
//        $user->password = '567';
//        $user->gender = '男';
//        $user->email = 'yatiangou@163.com';
//        $user->price = 200;
//        $user->details = '123';
//        $user->uid = 2011;
//        $user->create_time = date('Y-m-d H:i:s');
//        $user->save();
        //print_r($user);

        //3.也可以通过save()传递数据数组的方式，来新增加数据
//        $result = $user->save([
//            'username' => '雪童子',
//            'password' => '567',
//            'gender' => '男',
//            'email' => 'heitongzi163.com',
//            'price' => 300,
//            'details' => '123',
//            'uid' => 2012,
//            'create_time' => date('Y-m-d H:i:s')
//        ]);
//        echo $result;
        // 当新增成功后，使用 $user->id ,可以或得自增ID（主键需要是id）
        //echo $user->id;

        //使用saveAll()方法，可以批量新增数据，返回批量新增的数组
       $dataAll = [
           [
               'username' => '荒川之主',
            'password' => '567',
            'gender' => '男',
            'email' => 'huangchuan163.com',
            'price' => 400,
            'details' => '123',
            'uid' => 3000,
           ],
           [
               'username' => '彼岸花',
            'password' => '567',
            'gender' => '女',
            'email' => 'bianhua163.com',
            'price' => 300,
            'details' => '123',
            'uid' => 3001,
           ]
       ];
       print_r($user->saveAll($dataAll));
    }

    public function delete(){
        //使用get()方法，通过主键（id）查询到想要删除的数据；再通过delete()方法，将数据删除，返回布尔值
//        $user = userModel::get(245);
//        print_r($user->delete());

        //也可以使用静态方法调用destory()方法,通过主键（id）删除数据
//        UserModel::destroy(19);

        //静态方法destory()方法，也可以批量删除数据
//        UserModel::destroy('80 90 100');
//        UserModel::destroy([80,90,100]);

        //通过数据库类的查询条件删除
//        UserModel::where('id','=',80)->delete();

        //使用闭包的形式进行删除
        UserModel::destroy(function($query){
            $query -> where('id','=',21);
        });
    }
    public function update(){
          //1.使用get()方法通过主键获取数据，然后通过save()方法保存修改，返回布尔值
            $user = UserModel::get(251);
        $user->username =  'lalal';
        $user->mail ='lalal@163.com';
        $user->gender = '女';
        echo $user->save();
        // 动态设置只读字段
        //$user->readonly(['username'])->save();


            //2.通过where()方法结合find()方法的查询条件获取数据，进行修改
//            $user = UserModel::where('username','白狼')->find();    //find()只能找一条数据(最近一条)
//            $user->username = '黑狼';
//            $user->email = 'heilang@163.com';
//            echo $user->save();

            //3save()方法只会更新变化的数据，如果提交的修改数据没有变化，则不会更新
            //如果想要强制更新。即使数据一样，那么可以使用force()方法
//            $user->force()->save();

            //Db::raw()执行SQL函数的方式，在这里同样有效
//            $user = UserModel::get(250);
////            $user->price = Db::raw('price+1');
//            //如果只是单纯的增减数据修改，可以使用inc/dec
//            $user->price = ['inc',1];
//            echo $user->save();

            //可以直接通过save([],[])两个数组参数的方式更新数据
//            $user = new UserModel();
//            $user->save([
//                'username' => '铁鼠',
//                'email' => 'tiesu@163.com'
//            ],
//                ['id'=>250]
//            );

            //通过setAll()方法，可以批量修改数据，返回被修改数据的集合
            //批量更新saveAll()只能通过主键id进行更新
//            $user = new UserModel();
//            $list = [
//                ['id'=>1,'username'=>'李白'],
//                ['id'=>2,'username'=>'李白'],
//                ['id'=>3,'username'=>'李白']
//            ];
//            $user->save($list);

            //使用静态方法结合update()方法来更新数据，这里返回的是影响行数
//            UserModel::where('id',252)->update([
//                'username' => '犬神',
//                'email' => 'quanshen@163.com'
//            ]);
//            UserModel::update([
//                'id'=>123,
//                'username' => '犬神',
//                'email' => 'quanshen@163.com'
//            ]);


        }
        // 模型的新增和修改都是用save()进行执行的，它采用了自动识别体系来完成
        // 实例化模型后调用Save()方法表示新增，查询数据后调用save()表示修改
        //当然，如果在save()传入更新的修改条件也表示修改
        //再当然，如果编写代码比较复杂，可以用isUpdate()方法显示操作
        //显示更新  $user->isUpdate(true)->save()
        //显示新增 $user->isUpdate(false)->save()

    public function Search(){
        //模型搜索器

        //在控制器端，通过withSearch()静态方法实现模型搜索器的调用
        //如果想在搜索器查询的基础上再增加查询条件，直接使用链式查询即可
        //字段也可以设置别名
//        $result = UserModel::withSearch(['email','create_time'/*=>'ctime'*/],
//            [
//                'email' => 'xiao',
//                'create_time' => [
//                    '2015-1-1',
//                     '2020-2-17'
//                ],
//                'sort' => ['price'=>'desc']
//            ])->where('gender','男')->select();
//       //return json($result);
//        return Db::getLastSql();


        //模型数据集
//        $result = UserModel::where('id',250)->select();
//
//        //判断数据结果集是否为空，isEmpty()
//        if($result->isEmpty()){
//            return '数据结果集不住!';
//        }


       //hidden()可以隐藏某个字段，使用visible()显示某个字段
        //$result = UserModel::select();
        //$result->hidden(['password']);
        //$result->visible(['username']);
        //使用append()可以添加某个获取器字段，使用withAttr()对字段进行函数处理
//        $result->append(['nothing'])->withAttr('email',function($value){
//            return strtoupper($value);
//        });

        //使用模型方法filter()对筛选的数据进行过滤
//        $result = $result->filter(function($data){
//            return $data['price']<80;
//        });

        //也可以使用数据集之后链接 where()方法来代替 filter()方法；
//        $result = UserModel::select()->where('price', '>', '100');

        //数据集甚至还可以使用 order()方法进行排序；
//         $result = UserModel::select()->order('price', 'desc');
//        return dump($result);

        //使用 diff()和 intersect()方法可以计算两个数据集的差集和交集；
        $result1 = UserModel::where('price', '>', '80')->select();
        $result2 = UserModel::where('price', '<', '100')->select();
        return json($result1->diff($result2));
        return json($result1->intersect($result2));
    }

    //类型转换还会调用属性里的获取器操作，编码时要注意着方面问题
    public function typeConversion(){
        $user = UserModel::get(251);
        var_dump($user->price);
        var_dump($user->create_time);
    }

    //查询范围
    public function queryScoe(){
        //查询范围只能使用 find()和 select()两种方法；


        //写法1
        //$result = UserModel::scope('GenderMale')->select();
        //写法2
        //$result = UserModel::GenderMale()->select();

        $result = UserModel::EmailLike('xiao')->PriceGreate(300)->select();


        //UserModel::useGlobalScope(false)->EmailLike('xiao')->PriceGreate(300)->select()  取消掉全局查询
       //return json($result);
    }

    //
    public function view(){
        $user = UserModel::get(251);
        $this->assign('user',$user);
        return $this->fetch();
    }
    //
    public function output(){
        //使用 toArray()方法，将对象按照数组的方式输出；
        //使用 toJson()方法将数据对象进行序列化操作
        //使用 toJson()方法将数据对象进行序列化操作
        $user = UserModel::get(251);
        print_r($user->toJson());
    }

    //
    public function json(){


        //数据库写入 JSON 字段，直接通过数组的方式即可完成；
//        $data = array(
//            'username'=>'杀生丸',
//            'password'=>123,
//            'gender'=>'男',
//            'email'=>'shashengwang@qq.com',
//            'price'=>90,
//            'details'=>['content'=>123],
//            'uid'=>1,
//            'list' => ['username'=>'李白','gender'=>'男','email'=>'libai@qq.com','uid'=>'1011']
//        );
//        Db::name('user')->json(['list','details'])->insert($data);

        //$user = Db::name('user')->json(['details','list'])->where('id',264)->find();
//        $user = Db::name('user')->json(['details','list'])->where('list->username','李白')->find();
//        return json($user);

         //如果想完全修改json数据,可以使用如下方式
        //$data['list'] = ['username'=>'李黑','gender'=>'女'];
        //$user = Db::name('user')->json(['details','list'])->where('id',264)->update($data);
        //如果只想修改json数据里的某一项，可以使用如下方法实现
//        $data['list->gender'] = '男';
//        Db::name('user')->json(['list'])->where('id',264)->update($data);


        //模型json
//        $user = new UserModel();
//        $user->username = '犬夜叉';
//        $user->password = 789;
//        $user->gender = '男';
//        $user->email = 'quanyecha@qq.com';
//        $user->price = 900;
//        $user->status = 1;
//        $user->details = ['content'=>123];
//        $user->list= ['username'=>'鸣人','gender'=>'男'];
//
//        $user->save();

//        $user = UserModel::get(265);
//        return $user->list->username;

        //通过json数据查询
//        $user = UserModel::where('list->username','鸣人')->find();
//        return json($user);

        //修改
//        $user = UserModel::get(265);
//        $user->list->username = '佐助';
//        $user->save();
    }

    //设置软删除
    //软删除，并不是真的删除数据，而是给数据设置一个标记
    //首先，我们需要在数据表创建一个delete_time，默认为NULL
    //其次，使用软删除功能，软删除其实就是update操作，创建一个时间标记


     public function softDelete(){
         //数据库软删除
//        Db::name('user')
//            ->where('id',265)
//            ->useSoftDelete('delete_time',date('Y-m-d H:i:s'))
//            ->delete();
//
//        return Db::getLastSql();


     //模型软删除
        //
//         $user = UserModel::get(263);
//         $user->delete();

         //在开启软删除的前提下，使用withTrashed()方法屏蔽软删除的数据
//         $user = UserModel::withTrashed()->select();
//         return json($user);

         //用onlyTrashed() 搜索被软删除的数据
//         $user = UserModel::onlyTrashed()->select();
//         return json($user);

         //恢复其中一条被软删除的数据  用restore()
//      $user = UserModel::onlyTrashed()->get(263);
//       $user->restore();

         //如果想要一条软删除数据真正删除，在恢复正常后，使用delete（true）
//         $user = UserModel::onlyTrashed()->get('263');
//         $user->delete(true);





         //  默认情况下，开启了软删除功能的查询，模型会自动屏蔽被软删除的数据
         //$user = UserModel::select();
         // return Db::getLastSql();
         // return json($user);
     }
}